package com.itzhouwei.commerce.thread;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.function.Supplier;

/**
 * <h1>异步串行话 对象<h1/>
 * @description:
 * @author：zw，微信：yingshengzw
 * @date: 2023/2/6
 * @Copyright： 公众号：搬砖暗夜码农 | 博客：https://itzhouwei.com - 沉淀、分享、成长，让自己和他人都能有所收获！
 * @param <T> 返回值类型 可以是VO 也可以是String
 */
@Component
public class CompletableFutureX<T>{


    @Autowired
    private ThreadPoolExecutor threadPoolExecutor;



    /***
     * 异步对象并且带有返回结果集的操作方法
     * @param supplier 可以传入一个匿名类 进行操作 比如 ()->{}
     * @param <T> 返回值类型 可以是VO 也可以是String
     * @return
     */
    public  <T> CompletableFuture<T> supplyAsync(Supplier<T> supplier) {
        return CompletableFuture.supplyAsync(supplier,threadPoolExecutor);
    }


    /***
     * 多任务组合  并且 等待所有任务完成   返回结果
     * @param cfs 串行 线程 返回值
     * @return
     */
    public   CompletableFuture<Void> allOfAndGet(CompletableFuture<?>... cfs) {
        CompletableFuture<Void> voidCompletableFuture = CompletableFuture.allOf(cfs);
        try {
            voidCompletableFuture.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        return voidCompletableFuture;
    }

    public static void main(String[] args) {

    }



}
